# @Time : 2024-10-23 16:47
# @Author : Fioman 
# @Phone : 13149920693
"""
for循环:
1) 首先尝试调用__iter__()方法,将其转换为一个迭代器,如果没有__iter__方法,会调用__getitem__()模拟迭代
2) __getitem__(index) 从0开始,直到发生IndexError
"""


class MyIterable():
    def __init__(self, data):
        self.data = data

    # 实现 __getitem__,支持索引访问
    def __getitem__(self, index):
        print("__getitem__被调用: index = {}".format(index), end=" ")
        return self.data[index]

    def __len__(self):
        return len(self.data)


myiterable = MyIterable(range(10))
for i in myiterable:
    print(i)

# 然后我们看一下Myiterable的类型
print(type(myiterable))
# 对这个MyIterable()进行切片
mySlice = myiterable[:3]
print(mySlice, type(mySlice))  # 变成了range为什么呢
# __getitem__被调用: index = slice(None, 3, None) range(0, 3) <class 'range'>
# 可以看出来,它其实相当于是给data对象传入了一个切片对象

print(len(myiterable))  # 如果没有实现len方法就打印不了
